#pragma once 

#include <iostream>
#include <string>
#include <sys/types.h>
#include <sys/socket.h>

//工具类
class Util
{
    public:
      //因为在不同的平台可能行结束符不一样，有的时\n,有的是\r,有的是\r\n所以这里我们就要整理一下将所有的换行符统一转化成按\n结尾
      static int ReadLine(int sock, std::string &out)
      {//按行读取,将读到的内容放到out中
        char ch = 'X';
        while (ch != '\n')
        {
            ssize_t s = recv(sock , &ch , 1 , 0); //将读到的字符放到ch中
            if (s > 0)
            {
                if (ch == '\r') 
                { //此时要先看看\r后面的元素是什么
                  recv(sock , &ch , 1 , MSG_PEEK); //该标志位就是用来窥探后一位的内容
                  if (ch == '\n')
                  {//此时说明当前的行分隔符是\r\n
                    //窥探成功，这个字符一定存在
                    recv(sock , &ch , 1 , 0); //此时就直接将后面的\n拿过来了，不窥探了
                  }

                  else 
                  {
                    ch = '\n';
                  }
                }
                out += ch;
            }

            else if (s == 0)
            {
                return 0; //对端关闭了
            }

            else 
            {
                return -1; //读取错误
            }
        }
        return out.size();          
      }

      //分割当前字符串，将字符串分割成kv结构的
      static bool CutString(const std::string& target , std::string& sub1_out , std::string& sub2_out , std::string sep)
      {
          size_t pos = target.find(sep); //以sep为分割符来切割字符串
          if (pos != std::string::npos)
          {//此时表示当前位置是被找到了
              sub1_out = target.substr(0 , pos);
              sub2_out = target.substr(pos + sep.size()); //这里不写就直接截取到最后
              return true;
          }

          return false;
      }
};
